package br.com.toscano.gobra.domain;

import java.math.BigDecimal;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity 
@Table(name="ITEM_TABELA_PRECO_LICITACAO_ADITIVO")
public class ItemTabelaPrecoLicitacaoAditivo {

	public static String TIPO_ACAO_ADICIONAR_QUANTIDADE_ITEM = "A";
	public static String TIPO_ACAO_EXCLUIR_QUANTIDADE_ITEM = "S";
	public static String TIPO_ACAO_ADICIONAR_NOVO_ITEM = "N";
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name="ITPA_ID")
	private Long id;

	@ManyToOne(fetch = FetchType.LAZY, optional = false)
	@JoinColumn(name = "ADIT_ID")
	private Aditivo aditivo;

	@ManyToOne(fetch = FetchType.LAZY, optional = false)
	@JoinColumn(name = "ITPL_ID")
	private ItemTabelaPrecoLicitacao itemTabelaPrecoLicitacao;

	@ManyToOne(fetch = FetchType.LAZY, optional = false)
	@JoinColumn(name = "LOIT_ID")
	private LocalItem localItem;

	@ManyToOne(fetch = FetchType.LAZY, optional = false)
	@JoinColumn(name = "AGIT_ID")
	private AgrupamentoItem agrupamentoItem;

	@ManyToOne(fetch = FetchType.LAZY, optional = false)
	@JoinColumn(name = "CBDI_ID")
	private ComposicaoBDI composicaoBDI;

	@Column(name = "ITPA_TIPO_ADITIVO", nullable=false, length=1)
	private String tipoAcao = TIPO_ACAO_ADICIONAR_QUANTIDADE_ITEM;

	@Column(name = "ITPA_PERIODO_INICIAL", nullable = false, precision = 19, scale = 2)
	private BigDecimal periodoInicial;
	
	@Column(name = "ITPA_PERIODO_FINAL", nullable = false, precision = 19, scale = 2)
	private BigDecimal periodoFinal;
	
	@Column(name = "ITPA_VALOR_UNITARIO", nullable = false, precision = 19, scale = 2)
	private BigDecimal valorUnitario;
	
	@Column(name = "ITPA_VALOR_UNITARIO_COM_BDI", nullable = false, precision = 19, scale = 2)
	private BigDecimal valorUnitarioComBDI;
	
	@Column(name = "ITPA_QUANTIDADE", nullable = false, precision = 19, scale = 2)
	private BigDecimal quantidade;

	@Column(name = "ITPA_QUANTIDADE_DIAS", nullable = false, precision = 19, scale = 2)
	private BigDecimal quantidadeDias;

	@Column(name = "ITPA_VALOR_FINAL", nullable = false, precision = 19, scale = 2)
	private BigDecimal valorFinalItem;

	@Column(name = "ITPA_ORDEM_EXIBICAO", precision = 4, scale = 0)
	private Integer ordemExibicao;

	public int hashCode() {
		StringBuffer sb = new StringBuffer();
		
		sb.append(this.getId());
		return sb.toString().hashCode();
	}

	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		ItemTabelaPrecoLicitacaoAditivo other = (ItemTabelaPrecoLicitacaoAditivo) obj;
		if ((id == null && other.id == null) || (id == 0 && other.id == 0)) {
			return itemTabelaPrecoLicitacao.equals(other.itemTabelaPrecoLicitacao) 
					&& ((agrupamentoItem != null && other.agrupamentoItem != null && agrupamentoItem.equals(other.agrupamentoItem)) ||
							(agrupamentoItem == null && other.agrupamentoItem == null))
					&& ((localItem != null && other.localItem != null && localItem.equals(other.localItem)) ||
							(localItem == null && other.localItem == null));
		}else if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id)) {
			return false;
		}
		return true;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Aditivo getAditivo() {
		return aditivo;
	}

	public void setAditivo(Aditivo aditivo) {
		this.aditivo = aditivo;
	}

	public ItemTabelaPrecoLicitacao getItemTabelaPrecoLicitacao() {
		return itemTabelaPrecoLicitacao;
	}

	public void setItemTabelaPrecoLicitacao(
			ItemTabelaPrecoLicitacao itemTabelaPrecoLicitacao) {
		this.itemTabelaPrecoLicitacao = itemTabelaPrecoLicitacao;
	}

	public LocalItem getLocalItem() {
		return localItem;
	}

	public void setLocalItem(LocalItem localItem) {
		this.localItem = localItem;
	}

	public AgrupamentoItem getAgrupamentoItem() {
		return agrupamentoItem;
	}

	public void setAgrupamentoItem(AgrupamentoItem agrupamentoItem) {
		this.agrupamentoItem = agrupamentoItem;
	}

	public String getTipoAcao() {
		return tipoAcao;
	}

	public void setTipoAcao(String tipoAcao) {
		this.tipoAcao = tipoAcao;
	}

	public ComposicaoBDI getComposicaoBDI() {
		return composicaoBDI;
	}

	public void setComposicaoBDI(ComposicaoBDI composicaoBDI) {
		this.composicaoBDI = composicaoBDI;
	}

	public BigDecimal getPeriodoInicial() {
		return periodoInicial;
	}

	public void setPeriodoInicial(BigDecimal periodoInicial) {
		this.periodoInicial = periodoInicial;
	}

	public BigDecimal getPeriodoFinal() {
		return periodoFinal;
	}

	public void setPeriodoFinal(BigDecimal periodoFinal) {
		this.periodoFinal = periodoFinal;
	}

	public BigDecimal getValorUnitario() {
		return valorUnitario;
	}

	public void setValorUnitario(BigDecimal valorUnitario) {
		this.valorUnitario = valorUnitario;
	}

	public BigDecimal getValorUnitarioComBDI() {
		return valorUnitarioComBDI;
	}

	public void setValorUnitarioComBDI(BigDecimal valorUnitarioComBDI) {
		this.valorUnitarioComBDI = valorUnitarioComBDI;
	}

	public BigDecimal getQuantidade() {
		return quantidade;
	}

	public void setQuantidade(BigDecimal quantidade) {
		this.quantidade = quantidade;
	}

	public BigDecimal getQuantidadeDias() {
		return quantidadeDias;
	}

	public void setQuantidadeDias(BigDecimal quantidadeDias) {
		this.quantidadeDias = quantidadeDias;
	}

	public BigDecimal getValorFinalItem() {
		return valorFinalItem;
	}

	public void setValorFinalItem(BigDecimal valorFinalItem) {
		this.valorFinalItem = valorFinalItem;
	}

	public Integer getOrdemExibicao() {
		return ordemExibicao;
	}

	public void setOrdemExibicao(Integer ordemExibicao) {
		this.ordemExibicao = ordemExibicao;
	}
}